|
|
|
|
مقدمه
السلام عليكم ثانيةً ... تابعنا سوياً الدروس السابقه فى لغتنا المحببه الأسمبلى وتعرفنا على ماهى اللغه و خواصها و قدرتها ... تمام .!؟
وتابعنا أيضاً الدرس السادس و الذى يشرح التفاصيل الأساسيه فى اللغه و كيفية كتابة البرامج و كيفية تشغيلها.
سنبدأ إن شاء الله هذا الدرس و الذى سيكون حول مواضيع متقدمه نسبياً .
ملحوظه : لاحظتم أن الدرس إن شاء الله سيكون باللغه العربيه بناءاً على طلبكم .
|
(1) العمليات الحسابيه المتقدمه و تنقسم إلى ضرب و قسمه :-
الضرب Multiplication :-
يتم ضرب أى رقمين فى لغة الأسمبلى فى ثلاث أنظم ألى الآن :-
الأول : ال8-بت (البايت) :-
يتم وضع إحدى قيم الضرب فى AL و الآخر فى أى ريجستر آخر له نفس الحجم أو مكان فى الذاكره بجانب كود الضرب الذى هو فى حالتنا هنا [MUL] للأرقام الغير محددة الإشاره . و [IMUL] للأرقام المحددة الإشاره .وتوضع النتيجه فى ال AX .
مثال : للحصول على حاصل ضرب 120 * 30 نقوم بالأتى :-
;----------------------------------
MOV CL,30D
MOV AL,120D
MUL CL
MOV [1000H] , AX ; لتخزين الناتج فى الذاكره المعنونه ب1000 بالنظام السادس عشر
;----------------------------------
الثانى : ال16-بت (الكلمه) :-
يتم وضع إحدى القيم فى AX و ألآخرفى أى ريجستر آخر له نفس الحجم أو مكان فى الذاكره بجانب كود الضرب و توضع النتيجه فى DX:AX . و هذا معناه أن الجزء ال Low من ناتج القسمه سيخزن فى ال AX و الجزء ال High سيوضع فى ال DX .
مثال : للحصول على حاصل ضرب 20000 * 2365 سنقوم بالآتى :-
;----------------------------------
MOV CX,2365D
MOV AX,20000D
MUL CX
MOV [1000H],AX ;تخزين الجزء الأول فى المكان فى الذاكره المعنون ب 1000
MOV [1001H],DX ;تخزين الجزء الثانى فى المكان فى الذاكره الذى يلى المكان السابق
;----------------------------------
الثالث : ال32 بت :-
يتم وضع إحدى القيم فى EAX و ألآخرفى أى ريجستر آخر له نفس الحجم أو مكان فى الذاكره بجانب كود الضرب و توضع النتيجه(64 بت) فى EDX:EAX . و هذا معناه أن الجزء ال Low من ناتج القسمه سيخزن فى ال EAX و الجزء ال High سيوضع فى ال EDX .
القسمه Division :-
أيضاً تتم فى نفس النظم السابقه :-
الأول : ال8بت (بايت) :-
يتم و ضع المقسوم فى AX و المقسوم عليه فى أى ريجستر حجمه بايت مثل BL,CL,DL,... أو مكان فى الذاكره لها حجم بايت مثل BYTE PTR [1234H] , BYTE PTR [BX] .و يوضع ناتج القسمه فى AL و باقى القسمه فى AH بإستخدام [DIV] .
لاحظ:- أنه فى حالة قسمة الأرقام المحددة الإشاره بإستخدام [IDIV]تكون إشارة ناتج القسمه هى الإشاره العاديه فى هذه الحالات . وتكون إشارة خارج القسمه Remender دائماً موجبه و صحيحه Integer.
لاحظ:-كل القيم هنا 8-بت إذاً , لابد من تحويل القيمه ال 8-بت للمقسوم إلى 16-بت ليمكن نقلها ألى AX ويتم ذلك فى حالة القيم غير محددة الإشاره بمسح ال AH ليكون كله أصفار و تكون قيمة المقسوم 16-بت . أما فى حالة القيم محددة الإشاره يتم ذلك عن طريق كود [CBW] المسئول عن تحويل البايت(8-بت) إلى كلمه (16-بت) لل AX فقط.
مثال :- للحصول على ناتج قسمة(+16) على (-5) يمكننا عمل الأتى :-
;----------------------------------
MOV AL,16D
CBW
MOV BL,5D
NEG BL
IDIV BL
MOV PYTE PTR[1000H] , AL
MOV PYTE PTR[2000H] , AH
;----------------------------------
وهنا تم نقل المقسوم إلى AL وتم عمل مد له عن طريق [CBW] . ثم تم نقل قيمة المقسوم عليه إلى BL بعد وضع الإشاره السالبه عن طريق [NEG]. إذا القيم جاهزه لعملية القسمه ويتم حفظ الناتج فى الذاكره بعدها.
باقى النظم كما سبق من الممكن أن تقوم بإستنتاجها .
|
(2) التحكم فى مسار البرنامج :-
ينقسم التحكم فى مسار البرنامج إلى عدة طرق و تقنيات و تكون مثل مثيلاتها فى اللغات العليه و لكن أكثر تفصيلاً . وسنتعلم سوياً بعض من هذه التقنيات :-
أولا : جمل الشرط IF Statements :-
إننى أعتبر جمل الشرط من قواعد البرمجه عموما و من أهم قواعد التحكم فى مسار البرامج خصوصاً.
تقوم جمل الشرط عموما على و جود شرط أو إختبار لو تحقق إذاً سيقوم البرنامج بعمل بعض المهام لن يكون فاعلها لولم يتحقق الشرط أو فشل الإختبار , كما تحب أن تطلق عليه.
إذاً , يجب علينا معرفة كيفية إختبار قيمه (والتى يترتب عليها الشرط فيما بعد) .
الإختبار :-
يكون بإستخدام دالتين أو كودين و هما [CMP] و [TEST] .
1-[CMP] :- يجب أن تذكر القيمتين اللتان سوف يتم لهما إختبار بعدها . و عندما تتم هذه الجمله يتم عمل عملية طرح فى الأصل و لكن مع عدم تغيير فى أول مكان (الرجستر أو الذاكره)(Distination).لذلك التغيير يظهر فى ريجستر الأعلام (FLAG REGISTER) فقط و يكون القفز(JUMP) بعد هذا الإختبار شىء طبيعى على أساس إختبار بتات هذا الرجستر الخاص.أو أى عباره تأتى مع القفز كما تم ذكرهم فى الدرس السابق.
مثال :- سنقوم إختبار تساوى لقيمتين و ليكن 5و4 مثلاً . لو تحقق الشرط سيقفز البرنامج إلى النهايه و لن يكمل
;----------------------------------
MOV AX,5
MOV BX,4
CMP AX,BX ;=AX-BX
JE END
...................
................... ;بعض الجمل البرمجيه التى سوف تنفذ فى حالة عدم التساوى - طبعاً هتتنفذ .
...................
HLT ;تقوم هنا بوقف البرنامج مثلا أو القفز إلى مكان آخر لأنه من غير ذلك سوف يتم ينفيذ الأوامر التاليه أيضاً
END:
;الكمبيوتر إتجنن . إزاى 5 تساوى 4 .
...................
................... ;بعض الجمل البرمجيه التى سوف تنفذ فى حالة التساوى - طبعاً مش هتتنفذ .
...................
;----------------------------------
طبعا يوجد جُمل تقوم بالقفز إذا كان عدم التساوى أكبر من مثلاً أو القيمه الأولى أصغر من الأخرى وهكذا . يوجد الكثير و الكثير كما تحب أن تكتب برامجك.
2-[TEST] :-تقوم بالعمل السابق نفسه و لكن بدلاً من عمل عملية طرح , تقوم بعمل Logic AND و هى-بينى و بينكم-تستخدم فى إختبار بت واحده و هذه العمليه تسمى Masking .
مثال :- تعالو لنرى ماذا ستفعل هذه الداله :-
;----------------------------------
MOV AX,5
NEG AX
ADD AX,2
TEST AX,10000000B
JZ END
;القيمه سالبه كما هو متوقع
HLT
END:
;القيمه موجبه . كما هو ليس متوقع إطلاقاً.
;----------------------------------
المثال السابق يوضح إستخدام الأمر [TEST] فى إختبار آخر بت فى القيمه الموجوده فى الAX وهذه البت توضح إشارة الرقم كما لابد أن نعرف.فقمت بعمل TEST(AND) WITH 10000000B , IF the most segnificant bit in AX is (1) then zero flag will reset , else it will be set by the processor.
|
(3) الدورات loops :-
- من أهم قدرات الحاسب الألى هى عمل نفس الشىء مرات عده و لا تختلف معه عدد هذه المرات و هى من أهم جوانب البرمجه أصلاً . فلا يمكن لبرنامج مفيد ألا يحتوى على دوره أو عدة دورات لذا كان من المهم أن ندرجها هنا و تكون بعد التحكم فى مسار البرامج لما لها من إرتباط وثيق بما سوف نتحدث عليه.
- هناك ثلاث أنواع من الدورات تتم بثلاث تقنيات مختلفه . سيتم ذكر الأنواع أولاً ثم تتبعها طرق عملها و تقنياتها :-
الأنواع :-
الدورات المستمره (إلى مالانهايه) :-
وهى الدورات التى تظل عامله إلى أن يتم غلق البرنامج من جانب نظام التشغيل أو غلق الجهاز نفسه . و طبعاً أنت تسأل نفسك هل لهذا النوع فائده فى البرمجه . أرد عليك بنعم كما سترى :-
- التارخ و الساعه , هل هما يتوقفان !!؟ بالطبع لا.
- من الممكن إستخدامها فى ترك البرنامج عاملاً وهذا فى الللغات التى تعتمد على الأوامر المتواليه Squencial programming .
- أيضاً من الممكن أن تستخدم فى عمل الفيروسات . تكفى دوره صغيره غير منتهيه لإستغلال معظم و قت المعالج من غير فائده و التأثير على باقى البرامج الأخرى فى النظم متعددة البرامج Multiprogramming and Time-sharing Operating systems .
الدورات محددة المرات :-
فى هذه الدورات يكون عدد مرات تنفيذ الدوره محدد و هى من أكثر الأنواع إنتشاراً و لها إستخدامات عده تتنوع بين العمليات الحسابيه والمنطقيه و باقى العمليات الأخرى.
من أمثلتها ال FOR...NEXT) LOOP) .
الدورات المحدده بشرط معين :-
يكون هناك شرط يتم إختباره فى أول الدوره أو فى آخرها . ويتوقف تنفيذ المره التاليه فى الدوره على إختبار هذا الشرط , وهنا يتم إستخدام إحدى الشروط و طرق إختبارها السابقه.
التقنيات و طرق العمل:-
الطريقه اليدويه :-
عن طريق تحديد عنوان فى أول أمر فى الدوره ثم فى نهاية أوامر الدوره يتم إدراج أمر قفز للعنوان الذى وضعناه سابقاً و يكون القفز مشروط أو غير مشروط (Conditional / Unconditional Jump) .
مثال :-
;----------------------------------
MOV AL,5
XOR CL,CL ;CL = 0
START_LOOP : ;بداية الدوره
ADD CL,AL
DEC AL
CMP AL,00H ; قارن القيمه الموجوده فى الAL والصفر.
JNE START_LOOP ;يتم القفظ لو لم يكون AL يساوى صفر
MOV BYTE PTR [0100H],AL ;تخزين الناتج النهائى فى الذاكره .
;----------------------------------
فى المثال السابق تم إستخدام الدوره المشروطه START_LOOP فى جمع الأرقام من 1 إلى 5 و تخزينهم فى الذاكره .
الدورات بإستخدام الأمر LOOP :-
هذا الأمر له صور عده منها المشروط و منها الغير مشروط كما لابد أن نرى :-
[LOOP]:- يتم كتابة أسم أو عنوان أول جمله/أمر فى الدوره , ويتم وضع عدد مرات الدوره فى CX , وتقوم بتقليل ال CX بواحد وتختبر قيمته لو كانت صفر تنهى الدوره و لو غير ذلك يتم القفز ألى العنوان الموجود أمامها .
مثال :-
;----------------------------------
MOV CX,5
XOR AX,AX
START_LOOP :
ADD AX,CX
LOOP START_LOOP
MOV [0100H],AX
;----------------------------------
نفس المثال السابق.
Conditional LOOP:-
وهذه الأنواع تستخدم بعد CMP/TEST Instructions , وعلى حسب الشرط يتم القفز , ويكون إستخدامها مثل LOOP .
الدورات بإستخدام REP :-
وهى تستخدم مع نقل البيانات String Transfer Istructions و سنتعرض لها أن شاء الله فى الدرس القادم .
إلى هنا ينتهى درس الأسمبلى السابع و أرجو من الله أن يكون سهلاً و بسيطاً و أن يكون قدم شيئاً مفبداً و جديداً لأخواننا الأعزاء.
ولا تنسونى من الدعاء يا أخوانى .
والسلام عليكم و رحمة الله و بركاته
|
Send feed-back to webmaster@1t.2t.3t.4t.com
Copy rights reserved to Ezzuz web site
22 / 3 / 2003
|
|
|